package com.example.designpattern.creational.factory.abstract_factory;

import com.example.designpattern.creational.factory.common.product.fruit.Fruit;
import com.example.designpattern.creational.factory.common.product.mask.Mask;

public class User {
    // 可以看到，我们在创建时指定了具体的工厂类后，在使用时就无需再关心是哪个工厂类，只需要将此工厂当作抽象的 IFactory 接口使用即可。
    // 这种经过抽象的工厂方法模式被称作抽象工厂模式。
    private void eat() {
        // 由于客户端只和 IFactory 打交道了，调用的是接口中的方法，使用时根本不需要知道是在哪个具体工厂中实现的这些方法，
        // 这就使得替换工厂变得非常容易。

        // 如果需要替换为吃梨子，只需要更改一行代码即可
        // 更换指定的工厂即可替换一系列方法，而不需要修改业务代码，这都归功于工厂具有统一的抽象规范便于替换
        // 买苹果送医用口罩
//        IFactory factory = new AppleFactory();
        // 买梨送N95
        IFactory factory = new PearFactory();

        // 水果变了
        Fruit fruit = factory.createFruit();
        fruit.eat();
        // 送的口罩也变了
        Mask mask = factory.createMask();
        System.out.println(mask);
    }

    public static void main(String[] args) {
        User user = new User();
        user.eat();
    }
}